package com.my.main.common.utils;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.*;

public class FileUtil {
	
	/** 常量 */
	private static final String BASE_ENCODING = "utf-8";

	private static final int BUFFER_SIZE = 2*1024;
	
	protected static Log logger = LogFactory.getLog(FileUtil.class);
	
	
	/**
	 * 创建文本文件
	 * @param filePath	文本文件的地址
	 */
	public static File createTextFile(String filePath) throws Exception {
		
		File file = new File(filePath);
		if(file.exists()) {
			return file;
		}
		
		createFileDir(filePath);
		file.createNewFile();
		return file;
	}
	
	
	/**
	 * 读取文本文件
	 * @param filePath	文本文件的地址
	 * @return			文本内的字符串
	 */
	public static String readTextFile(String filePath) throws Exception {
		
		File file = new File(filePath);
		
		InputStream is = null;
		try {
			is = new FileInputStream(file);
			byte[] b = new byte[(int)file.length()]; 
			int len = 0; 
			int temp = 0; 
			while((temp=is.read()) != -1){ 
		       b[len]=(byte)temp; 
		       len++; 
			} 
			return new String(b, 0, len, BASE_ENCODING);
		}
		finally {
			if(is != null) {
				is.close();
			}
		}
	}
	
	
	/**
	 * 快速读取文本文件
	 * @param filePath	文本文件的地址
	 * @return			文本内的字符串
	 */
	public static String fastReadTextFile(String filePath) throws Exception {
		
		File file = new File(filePath);
		
		InputStream is = null;
		try {
			is = new FileInputStream(file);
			byte[] b = new byte[1024];
			int len = 0;
			StringBuffer sb = new StringBuffer();
			while((len=is.read(b)) != -1) {
				sb.append(new String(b, 0, len, BASE_ENCODING));
			}
			return sb.toString();
		}
		finally {
			if(is != null) {
				is.close();
			}
		}
	}
	
	
	/**
	 * 重命名文件
	 * 如果新命名的文件存在，则覆盖
	 * @param file			源文件
	 * @param newFileName	新文件名
	 * @return				true	成功
	 * 						false 	失败
	 */
	public static boolean renameFile(File file, String newFileName) {
		
		if(!file.exists()) {
			return false;
		}
		
		File newFile = new File(file.getParent() + File.separator + newFileName);
		if(newFile.exists() && newFile.delete()==false) {
			return false;
		}
		
		return file.renameTo(newFile);
	}
	
	
	/**
	 * 复制单个文件
	 * 
	 * @param origFile 		待复制的文件
     * @param toFilePath	目标文件名
     * @param overlay		如果目标文件存在，是否覆盖
     * @return 				如果复制成功返回true，否则返回false
	 */
	public static boolean copyFile(File origFile, String toFilePath,  
            											boolean overlay) {  
        // 判断源文件是否存在
        if(!origFile.exists()) {
        	logger.warn("原始文件不存在："+origFile.getPath());
            return false;
        }
        // 判断源文件是否是文件
        if(!origFile.isFile()) {
        	logger.warn("原始文件不是一个文件："+origFile.getPath());
            return false;
        }
  
        // 判断目标文件是否存在  
        // 如果存在并需要覆盖，则将原文件删除；如果不需要覆盖，则直接返回true
        // 如果不存在，则创建所需的目录
        File toFile = new File(toFilePath);
        if(toFile.exists()) {
            if(overlay) {
                new File(toFilePath).delete();
            }
            else {
            	return true;
            }
        }
        else {
            if(!toFile.getParentFile().exists()) {
                if(!toFile.getParentFile().mkdirs()) {
                    return false;
                }
            }
        }

        // 开始复制文件
        int byteread = 0; // 读取的字节数
        InputStream in = null;
        OutputStream out = null;

        try {
            in = new FileInputStream(origFile);
            out = new FileOutputStream(toFile);
            byte[] buffer = new byte[BUFFER_SIZE];

            while ((byteread = in.read(buffer)) != -1) {
                out.write(buffer, 0, byteread);
            }
            return true;
        }
        catch (IOException e) {
        	logger.error(e);
        	return false;
        }
        finally {
            try {
            	if(in != null) {
            		in.close();
            	}
            	if(out != null) {
            		out.close();
            	}
            }
            catch (IOException e) {
                logger.error(e);
            }
        }
    }
	
	
	/**
	 * 创建保存文件的目录
	 * @param filePath
	 */
	public static void createFileDir(String filePath) {
		
		filePath = filePath.replaceAll("\\\\", "/");
        File dir = new File(filePath.substring(0, filePath.lastIndexOf("/")));
        if(!dir.exists()) {
        	dir.mkdirs();
        }
        
	}
	/**
	 * 创建文件的目录
	 * @param filePath
	 */
	public static void createDir(String dirPath) {
		
        File dir = new File(dirPath);
        if(!dir.exists()) {
        	dir.mkdirs();
        }
        
	}
	
	
	/**
	 * Byte转File
	 * @param buf
	 * @param filePath
	 * @param fileName
	 */
	public static void byte2File(byte[] buf, String filePath, String fileName) {
        BufferedOutputStream bos = null;  
        FileOutputStream fos = null;  
        File file = null;  
        try  
        {  
            File dir = new File(filePath);  
            if (!dir.exists() && dir.isDirectory())  
            {  
                dir.mkdirs();  
            }  
            file = new File(filePath + File.separator + fileName);  
            fos = new FileOutputStream(file);  
            bos = new BufferedOutputStream(fos);  
            bos.write(buf);  
        }  
        catch (Exception e)  
        {  
            e.printStackTrace();  
        }  
        finally  
        {  
            if (bos != null)  
            {  
                try  
                {  
                    bos.close();  
                }  
                catch (IOException e)  
                {  
                    e.printStackTrace();  
                }  
            }  
            if (fos != null)  
            {  
                try  
                {  
                    fos.close();  
                }  
                catch (IOException e)  
                {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }
	
}